#include<iostream>
#include <sched.h>
#include<sys/wait.h>
#include<signal.h>
#include<unistd.h>
#include<cstdlib>

// void waitChild(int signum)
// {
//     while(1)
//     {
//         pid_t id = waitpid(-1, NULL, WNOHANG);
//         if(id == 0)
//         {
//             break;
//         }
//         else if(id < 0)
//         {
//             std::cout<<"Error in waitpid"<<std::endl;
//             break;
//         }
//     }
//     std::cout<<"get a signal :" << signum << std::endl;
// }


// int main()
// {
//     signal(SIGCHLD, SIG_IGN);
//     for(int i = 0; i < 10; i++)
//     {
//         pid_t id = fork();
//         if(id == 0)
//         {
//             sleep(2);
//             std::cout<<"Child process "<<getpid()<<" is running"<<std::endl;
//             exit(0);
//         }
//     }
//     while(1)
//     {
//         std::cout<<"Parent process "<<getpid()<<" is running"<<std::endl;
//         sleep(1);
//     }

//     return 0;
// }



// volatile int flag = 0;   //  系统优化  导致全局变量的修改不一定会立即生效  volatile关键字可以保证修改立即生效

// void handler(int signu)
// {
//     std::cout << "更改全局变量, " << flag << "-> 1" << std::endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2, handler);

//     while(!flag);
//     std::cout << "process quit normal!" << std::endl;
//     return 0;
// }


//  sigaction函数的使用

void handler(int signum)
{
    std::cout << "hello signal: " << signum << std::endl;
    while(true)
    {
        //不断获取pending表！
        sigset_t pending;
        sigpending(&pending);
        for(int i = 31; i >= 1; i--)
        {
            if(sigismember(&pending, i))
                std::cout << "1";
            else
                std::cout << "0";
        }
        std::cout << std::endl;
        sleep(1);
    }
    exit(0);
}

//sigaction函数的各参数含义：
//第一个参数：信号值，可以是SIGINT、SIGTERM等
//第二个参数：指向sigaction结构体的指针，用于设置信号处理函数和信号掩码
//第三个参数：指向旧的sigaction结构体的指针，用于保存原来的信号处理函数和掩码

//sigaction结构体的各成员含义：
//sa_handler：信号处理函数，当捕捉到该信号时，系统调用该函数
//sa_mask：信号掩码，用于指定该信号的阻塞、忽略等属性
//sa_flags：信号处理标志，用于指定信号处理方式，如是否重启系统调用、是否向其他进程发送信号等

//信号处理函数的返回值：
//0：正常返回
//非0：表示发生错误，系统调用会返回-1，errno会被设置

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    act.sa_flags = 0;

    sigaction(SIGINT, &act, &oact); // 对2号信号进行了捕捉, 2,3,4都屏蔽

    while(true)
    {
        std::cout << "hello world: " << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}